﻿namespace MicroCloud.Message.Entities
{
    /// <summary>
    /// 实体类：模板消息
    /// </summary>
    [Table(nameof(TemplateMessage), Schema = TableSchemaConstants.Message)]
    [Description("模板消息")]
    [ValueGenerate(ValueGenerateRule.Never, ValueGenerateMode.Snowflake)]
    public class TemplateMessage : EntityBase<long>, ICreationAudited<long>, IUpdateAudited<long>, IDataVersion
    {
        #region "属性"
        #region "获取或设置 方法名"
        private string _Method = string.Empty;
        /// <summary>
        /// 获取或设置 方法名
        /// </summary>
        [Column("Method")]
        [StringSize(StringSizeType.Name)]
        [DisplayName("方法名")]
        public string Method { get { return _Method; } set { _Method = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 消息图标"
        private string _Icon = "";
        /// <summary>
        /// 获取或设置 消息图标
        /// </summary>
        [Column("Icon")]
        [StringMax]
        [DisplayName("消息图标")]
        public string Icon { get { return _Icon; } set { _Icon = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 消息类型"
        /// <summary>
        /// 获取或设置 消息类型
        /// </summary>
        [Column("MessageType")]
        [DisplayName("消息类型")]
        public MessageType MessageType { get; set; }
        #endregion
        #region "获取或设置 消息级别"
        /// <summary>
        /// 获取或设置 消息级别
        /// </summary>
        [Column("MessageLevel")]
        [DisplayName("消息级别")]
        public MessageLevel MessageLevel { get; set; }
        #endregion
        #region "获取或设置 标题"
        private string _Title = string.Empty;
        /// <summary>
        /// 获取或设置 标题
        /// </summary>
        [Column("Title")]
        [StringSize(StringSizeType.Name)]
        [DisplayName("标题")]
        public string Title { get { return _Title; } set { _Title = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 内容"
        private string _Content = string.Empty;
        /// <summary>
        /// 获取或设置 内容
        /// </summary>
        [Column("Content")]
        [StringSize(StringSizeType.Content)]
        [DisplayName("内容")]
        public string Content { get { return _Content; } set { _Content = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 数据体"
        private string _Payload = string.Empty;
        /// <summary>
        /// 获取或设置 数据体
        /// </summary>
        [Column("Payload")]
        [StringMax]
        [DisplayName("数据体")]
        public string Payload { get { return _Payload; } set { _Payload = value.ReplaceNull(); } }
        #endregion

        #region "获取或设置 发送方式集合"
        private string _SendWays = string.Empty;
        /// <summary>
        /// 获取或设置 发送方式集合
        /// </summary>
        [Column("SendWays")]
        [StringMax]
        [DisplayName("发送方式：1-Internal(内部消息)、2-Email(邮件消息)、99-OAuth2(第三方平台消息)")]
        public string SendWays { get { return _SendWays; } set { _SendWays = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 发送至用户集合"
        private string _ToUsers = string.Empty;
        /// <summary>
        /// 获取或设置 发送至用户集合
        /// </summary>
        [Column("ToUsers")]
        [StringMax]
        [DisplayName("发送至用户")]
        public string ToUsers { get { return _ToUsers; } set { _ToUsers = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 发送至组织机构集合"
        private string _ToOrganizations = string.Empty;
        /// <summary>
        /// 获取或设置 发送至组织机构集合
        /// </summary>
        [Column("ToOrganizations")]
        [StringMax]
        [DisplayName("发送至组织机构")]
        public string ToOrganizations { get { return _ToOrganizations; } set { _ToOrganizations = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 发送至角色集合"
        private string _ToRoles = string.Empty;
        /// <summary>
        /// 获取或设置 发送至角色集合
        /// </summary>
        [Column("ToRoles")]
        [StringMax]
        [DisplayName("发送至角色")]
        public string ToRoles { get { return _ToRoles; } set { _ToRoles = value.ReplaceNull(); } }
        #endregion

        #region "获取或设置 下次发送时间"
        /// <summary>
        /// 获取或设置 下次发送时间
        /// </summary>
        [Column("NextSendTime")]
        [DisplayName("下次发送时间")]
        public DateTime? NextSendTime { get; set; }
        #endregion
        #region "获取或设置 Cron表达式"
        private string _CronExpression = string.Empty;
        /// <summary>
        /// 获取或设置 Cron表达式
        /// </summary>
        [Column("CronExpression")]
        [StringSize(StringSizeType.General)]
        [DisplayName("Cron表达式")]
        public string CronExpression
        {
            get { return _CronExpression; }
            set
            {
                if (!value.IsMissing() && !value.IsCronExpression())
                {
                    throw new Exception(I18N.T("{0} 表达式值无效", nameof(value)));
                }
                _CronExpression = value.ReplaceNull();
                if (!_CronExpression.IsMissing())
                {
                    NextSendTime = CronHelper.GetNextDateTime(_CronExpression);
                }
            }
        }
        #endregion
        #region "获取或设置 是否启用"
        /// <summary>
        /// 获取或设置 是否启用
        /// </summary>
        [Column("Enabled")]
        [DisplayName("是否启用")]
        public bool Enabled { get; set; }
        #endregion

        #region "获取或设置 存储天数(0-365,0表示永久存储)"
        /// <summary>
        /// 获取或设置 存储天数(0-365,0表示永久存储)
        /// </summary>
        [Column("StorageDays")]
        [DisplayName("存储天数(0-365,0表示永久存储)")]
        public int StorageDays { get; set; }
        #endregion

        #region "获取或设置 创建者编号 ICreationAudited 可装载接口，在数据创建时可自动设置当前用户值"
        /// <summary>
        /// 获取或设置 创建者编号
        /// </summary>
        [Column("CreatorId")]
        [DisplayName("创建者编号")]
        public long? CreatorId { get; set; }
        #endregion
        #region "获取或设置 创建时间 ICreatedTime、ICreationAudited  可装载接口，在数据创建时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 创建时间
        /// </summary>
        [Column("CreatedTime")]
        [DisplayName("创建时间")]
        public DateTime CreatedTime { get; set; }
        #endregion

        #region "获取或设置 更新者编号 IUpdateAudited 可装载接口，在数据更新时可自动设置当前用户值"
        /// <summary>
        /// 获取或设置 更新者编号
        /// </summary>
        [DisplayName("更新者编号")]
        public long? UpdaterId { get; set; }
        #endregion
        #region "获取或设置 更新时间 IUpdatedTime、IUpdateAudited 可装载接口，在数据更新时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 更新时间
        /// </summary>
        [DisplayName("更新时间")]
        public DateTime? UpdatedTime { get; set; }
        #endregion

        #region "获取或设置 数据版本 IDataVersion 可装载接口，用于乐观并发处理"
        /// <summary>
        /// 获取或设置 数据版本
        /// 在实体提交验证后（增加、修改）会自动设置一个时间戳值持久化至数据库
        /// 修改、移除时取实体数据库值与提交值比对，如不一致则拒绝提交
        /// </summary>
        [AuditIgnore]
        [Column("DataVersion")]
        [DisplayName("数据版本")]
        public long DataVersion { get; set; }
        #endregion

        #endregion
    }
}